home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl720 / fast278j.lzh / PU.F < prev    next >
Text File  |  1992-10-12  |  8KB  |  377 lines

  1. ;===========================================================================
  2. ;=  PRINTER UTILITY, written in FAST. September 1987 (Updated May 89)       =
  3. ;=  By Peter Campbell                               =
  4. ;===========================================================================
  5.  
  6. print bios "PRINTER UTILITIES Written by Peter Campbell     (Shift-Shift to activate)."
  7. #window memory 5000
  8. #include extinput.fi
  9. #errors off
  10. #short
  11. var using
  12. const usere=30,userd=21*4,usert=21*usere+userd
  13. indo=indoso:inds=indoss
  14.  
  15. dos 35(17):poke pioff,reg bx:poke piseg,reg es
  16. setint 17h to prt_handle
  17. current_prt=0
  18.  
  19. cfg=allocate usert/16+1
  20. if error then print bios "PU: Out of memory, need 16K."
  21. open #1,config
  22. if error then
  23.     {
  24.     cfg_default:
  25.     fillb usert from cfg|0 with 0ffffh
  26.     moveb userd from cfg_codes to cfg|0
  27.     }
  28. else
  29.     {
  30.     re=read #1,usert to cfg|0
  31.     if error then close #1:goto cfg_default
  32.     close #1
  33.     if error then goto cfg_default
  34.     if re<>usert then goto cfg_default
  35.     }
  36.  
  37. activate=0  ;Currently not trying.
  38. on int 1
  39.     {
  40.     if ((peek 0|417h) and 3)=3 then activate=1
  41.     if activate and (inds[indo]b=0) then gosub printer_util
  42.     }
  43. on idle
  44.     {
  45.     if (activate=1) and (using=0) then gosub printer_util
  46.     }
  47.  
  48. stop resident
  49.  
  50. ;== routines ===============================================================
  51.  
  52. function ready
  53.     {
  54.     out_status:
  55.     reg dx=current_prt,ax=200h:int 17h:status=high reg ax
  56.     if (status and 10101001b)<>10000000b then
  57.     {
  58.     open window severe:beep
  59.     wout:
  60.     k=ucase key
  61.     if (k=27) or (k='A') then close window:return 0
  62.     if k<>'R' then goto wout
  63.     close window
  64.     goto out_status
  65.     }
  66.     return 1
  67.     }
  68.  
  69. proc out_codes(a)
  70.     {
  71.     if not ready then return
  72.     while cfg[a]b<>255 lprint chr cfg[a];:a++
  73.     }
  74.  
  75. ;== printer_util ===========================================================
  76.  
  77. printer_util:
  78. using=1
  79. oldpos=curpos
  80. activate=0
  81. old_psp=psp:psp reg cs
  82. video=(0b800h-(800h*mono))+page*100h
  83. opt=menu main_print:goto print_2
  84.  
  85. forever
  86. {
  87. opt=select main_print,opt
  88. print_2:
  89. if (opt=0) or (opt=10) then
  90.     {
  91.     printer_ret:
  92.     close window:curpos=oldpos
  93.     psp old_psp
  94.     using=0
  95.     return
  96.     }
  97. if opt=5 then if ready then lprint
  98. if opt=6 then if ready then lprint ff;
  99. if opt=7 then if ready then lprint chr 27;chr '@';
  100. if opt=1 then gosub set_mode
  101. if opt=9 then gosub input_msg
  102. if opt=11 then
  103.     {
  104.     reg dx=peek pioff,ds=peek piseg:dos 25(17)
  105.     reg ds=reg cs
  106.     reset interupts
  107.     deallocate cfg
  108.     deallocate reg cs
  109.     stop idle
  110.     goto printer_ret
  111.     }
  112. if opt=2 then gosub alter_mode
  113. if opt=4 then gosub change_printer
  114. if opt=3 then gosub user_codes
  115. if opt=8 then
  116.     {
  117.     save config,cfg|0,usert
  118.     if error then beep
  119.     }
  120. }
  121. ;===========================================================================
  122. set_mode:
  123. code=menu mode_options:goto set_mode2
  124. forever
  125.     {
  126.     code=select mode_options,code
  127.     set_mode2:
  128.     if code=0 then close window:return
  129.     out_codes(code*4-4)
  130.     }
  131. ;===========================================================================
  132. alter_mode:
  133. as=1:pokeb mode_options+1,0:open window mode_options
  134. pokeb mode_options+1,21
  135. am1:
  136. base=0
  137. colour 64
  138. for y=3 to 23
  139. locate y,47
  140. x=base:base+=4
  141. print "           ";:locate y,47
  142. while cfg[x]b<>255
  143.     {
  144.     printb cfg[x]b;" ";
  145.     x++
  146.     }
  147. next y
  148.  
  149. as=select mode_options,as
  150. if as=0 then close window:return
  151. base=4*as-4
  152. open window input_codes
  153. cursor 16,32:c1=inputb
  154. if c1=0 then goto no_input
  155. cursor 16,39:c2=inputb
  156. if c2=0 then c2=255:goto put_code
  157. cursor 16,46:c3=inputb
  158. if c3=0 then c3=255
  159. put_code:
  160. cfg[base]b=c1
  161. cfg[base+1]b=c2
  162. cfg[base+2]b=c3
  163.  
  164. no_input:
  165. close window
  166. goto am1
  167. ;===========================================================================
  168. change_printer:
  169. open window input_change
  170. cursor 21,70
  171. current_prt=inputb
  172. close window:return
  173. ;===========================================================================
  174. user_codes:
  175. pokeb user_code_names+1,0
  176. open window user_code_names
  177. pokeb user_code_names+1,21
  178. base=userd
  179. colour 15
  180. for y=3 to 23
  181. locate y,33:print "                                    ";
  182. a=base
  183. locate y,12:while cfg[a]b<>255 print chr cfg[a];:a++
  184. a=base+20:base+=30
  185. locate y,33
  186. while cfg[a]b<>255 printb cfg[a];" ";:a++
  187. next y
  188.  
  189. colour 7
  190. uc=menu get_function
  191. close window
  192. if uc=0 then close window:return
  193. if uc=1 then gosub select_user_code
  194. if uc=2 then gosub user_add
  195. close window
  196. goto user_codes
  197.  
  198. select_user_code:
  199. forever
  200.     {
  201.     code=select user_code_names,1
  202.     if code=0 then return
  203.     out_codes(userd+20+(code-1)*usere)
  204.     }
  205.  
  206. user_add:
  207. code=select user_code_names,1
  208. if code=0 then return
  209. ad=userd+(code-1)*usere
  210. open window enter_window
  211. colour 31:locate 14,23:print "Description: ";
  212. move 10 from cfg|ad to enter_name+2
  213. x=searchb 20 from enter_name+2 for 255:if x then pokeb x,13
  214. l=ext_input(enter_name)
  215. if l then pokeb enter_name+l+1,255
  216. move 10 from enter_name+2 to cfg|ad
  217.  
  218. x=0:ad+=20
  219. repeat 9 locate 16,x+14:print "[   ]";:x+=6
  220. byte=1:x=0
  221. while (x<9) and (byte<>0)
  222.     {
  223.     cursor 16,(x*6)+15
  224.     byte=inputb
  225.     cfg[ad]b=byte
  226.     ad++:x++
  227.     }
  228. cfg[ad-1]b=255
  229. close window
  230. return
  231. ;===========================================================================
  232. input_msg:
  233. open window msg_prt
  234. locate 12,5
  235. colour 60h
  236. l=ext_clean_input(msg)
  237. if l then
  238.     {
  239.     x=msg+2
  240.     if not ready then goto exit_msg
  241.     repeat l lprint chr peek x;:x++
  242.     if l then lprint
  243.     exit_msg:
  244.     }
  245. close window
  246. return
  247.  
  248. ;== Print through BIOS with print re-direction =============================
  249.  
  250. prt_handle:
  251. push reg ax
  252. inline 2eh
  253. push reg ds
  254. reg ds=reg cs
  255. reg dx=current_prt
  256. pop ds
  257. reg ds=ds
  258. inline 58h,0eah
  259. pioff:
  260. data 0
  261. piseg:
  262. data 0
  263.  
  264. ;== PU data ================================================================
  265.  
  266. config:
  267. fname 'pu.cfg'
  268.  
  269. input_change:
  270. datab 1,0,64,17,77,23,111b
  271. datab 22,1,1,'Printer? 0-2'
  272. datab 26
  273.  
  274. msg:
  275. string 40
  276.  
  277. msg_prt:
  278. datab 1,0,2,8,47,14,60h
  279. datab 22,3,1,'Input message:',26
  280.  
  281. cfg_codes:
  282. datab 27,'4',255,0
  283. datab 27,'5',255,0
  284. datab 27,'S0',255
  285. datab 27,'S1',255
  286. datab 27,'T',255,0
  287. datab 27,'P',255,0
  288. datab 27,'M',255,0
  289. datab 15,255,0,0
  290. datab 27,'E',255,0
  291. datab 27,'F',255,0
  292. datab 27,'W1',255
  293. datab 27,'W0',255
  294. datab 27,'-1',255
  295. datab 27,'-0',255
  296. datab 27,'2',255,0
  297. datab 27,'0',255,0
  298. datab 24,255,0,0
  299. datab 27,'n',255,0
  300. datab 27,'o',255,0
  301. datab 27,'p1',255
  302. datab 27,'p0',255
  303.  
  304. main_print:
  305. datab 1,11,50,3,75,17,1101000b
  306. datab 22,2,1,'PRINTER UTILITIES - PC'
  307. datab 22,2,3,'Set printer to...'
  308. datab 22,2,4,'Alter main codes.'
  309. datab 22,2,5,'Update/Set new codes.'
  310. datab 22,2,6,'Change current printer.'
  311. datab 22,2,7,'Line feed.'
  312. datab 22,2,8,'Form feed.'
  313. datab 22,2,9,'Reset printer.'
  314. datab 22,2,10,'Keep options (save).'
  315. datab 22,2,11,'Print message.'
  316. datab 22,2,12,'ESCape.'
  317. datab 22,2,13,'Disable PU.'
  318. datab 26
  319.  
  320. mode_options:
  321. datab 2,21,17,0,63,24,1000000b
  322. datab 22,6,1,'PRINTER CONTROLS'
  323. datab 22,2,3,'Italics ON'
  324. datab 22,2,4,'Italics OFF'
  325. datab 22,2,5,'Superscript ON'
  326. datab 22,2,6,'Subscript ON'
  327. datab 22,2,7,'Super/Sub OFF'
  328. datab 22,2,8,'10 cpi'
  329. datab 22,2,9,'12 cpi'
  330. datab 22,2,10,'17 cpi'
  331. datab 22,2,11,'Emphasised ON'
  332. datab 22,2,12,'Emphasised OFF'
  333. datab 22,2,13,'Double printing ON'
  334. datab 22,2,14,'Double printing OFF'
  335. datab 22,2,15,'Underline ON'
  336. datab 22,2,16,'Underline OFF'
  337. datab 22,2,17,'Paper feed 1/6'
  338. datab 22,2,18,'Paper feed 1/8'
  339. datab 22,2,19,'Clear buffer'
  340. datab 22,2,20,'NLQ 10cpi ON'
  341. datab 22,2,21,'NLQ 12cpi ON'
  342. datab 22,2,22,'Proportional spacing ON'
  343. datab 22,2,23,'Proportional spacing OFF'
  344. datab 26
  345.  
  346. input_codes:
  347. datab 1,0,29,12,51,18,1110000b
  348. datab 22,2,1,'Enter up to 3 codes'
  349. datab 22,2,4,'[   ]  [     ]  [    ]'
  350. datab 26
  351.  
  352. get_function:
  353. datab 1,2,0,4,10,9,0111111b
  354. datab 22,2,1,'OPTIONS'
  355. datab 22,2,3,'Set'
  356. datab 22,2,4,'Add'
  357. datab 26
  358.  
  359. user_code_names:
  360. datab 2,21,10,0,70,24,15
  361. datab 22,20,1,'USER DEFINABLE CODES'
  362. datab 26
  363.  
  364. enter_name:
  365. string 20
  366.  
  367. enter_window:
  368. datab 1,0,11,11,69,18,31
  369. datab 22,20,1,'USER DEFINABLE CODE'
  370. datab 26
  371.  
  372. severe:
  373. datab 0,0,29,10,50,15,120
  374. datab 22,2,2,'Printer Not Ready!'
  375. datab 22,5,3,'Abort/Retry?'
  376. datab 26
  377.